function MVVM(options) {
  debugger
  // 存储new Vue的配置对象,方便后面使用
  this.$options = options
  // 将配置对象的中data数据存储起来,方便后面使用
  var data = (this._data = this.$options.data)
  // 将vue实例存储起来,方便后面使用
  var me = this
  // 根据data对象的属性,生成一个数组,然后遍历数组
  Object.keys(data).forEach(function (key) {
    // 代用vue原型上的_proxy方法,将data中的每一条数据以数据代理的形式添加到实例上
    me._proxy(key)
  })
  // 数据劫持(暂时跳过)
  observe(data, this)
  // 编译模板
  this.$compile = new Compile(options.el || document.body, this)
}

MVVM.prototype = {
  $watch: function (key, cb, options) {
    new Watcher(this, key, cb)
  },
  // 利用Object.defineProperty进行数据代理
  _proxy: function (key) {
    var me = this
    Object.defineProperty(me, key, {
      configurable: false,
      enumerable: true,
      get: function proxyGetter() {
        return me._data[key]
      },
      set: function proxySetter(newVal) {
        me._data[key] = newVal
      },
    })
  },
}
